#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio_ext.h> /* Necessario para a funcao "__fpurge" */
#include <ctype.h> /* Necessario para a funcao "isdigit" */

#define tam_titulo 200
#define tam_tipo 100
#define tam_autor 125
#define tam_ano 4
#define tam_valor 12
#define tam_imagem 9
#define tam_total 450

/* define posicao do nrr na avail_head.dat para cada avail list */
#define pos_base 0
#define pos_titulo 1
#define pos_tipo 2
#define pos_autor 3
#define pos_ano 4

/* numero de digitos de um nrr */
#define dig_nrr 4


typedef struct No_PK {
	char titulo[tam_titulo+1]; /* estrutura para o arquivo/vetor com as chaves primarias */
	int nrr;
} No_PK;

typedef No_PK *pNo_PK;


/** @brief Funcao auxiliar para qsort/bsearch.

    /details Essa funcao compara duas obras usando strcmp.
    
    @param obra1 O vetor contendo os indices primarios.
    @param obra2 O vetor contendo os indices primarios.
    
*/
int compara (pNo_PK obra1, pNo_PK obra2 );

/** 
    @brief Menu de opcao de consultas.

    @param obras O vetor contendo os indices primarios.
    @param tamanho Tamanho do vetor com os indices primarios.
	@param sk_titulo Vetor contendo indices secundarios, por titulo.
	@param sk_tipo Vetor contendo indices secundarios, por tipo.
	@param sk_autor Vetor contendo indices secundarios, por autor.
	@param sk_ano Vetor contendo indices secundarios, por ano.
  	@param ttitulo Tamanho do vetor com os indices secundarios por titulo.
  	@param ttipo Tamanho do vetor com os indices secundarios por tipo.
  	@param tautor Tamanho do vetor com os indices secundarios por autor.
  	@param tano Tamanho do vetor com os indices secundarios por ano.
  	@param tam_nrr Tamanho do vetor com os indices primarios.

 */
void menu_consulta(pNo_PK obras, int tamanho, pNo_PK sk_titulo, pNo_PK sk_tipo, pNo_PK sk_autor, pNo_PK sk_ano, int ttitulo, int ttipo, int tautor, int tano, int tam_nrr);


/** 
   @brief Funcao que escreve os dados da obra (menos imagem) no arquivo HTML.
   
   @param origem Arquivo onde esta contida as informacoes(base de dados).
   @param destino Arquivo de destino(em HTML).                
   @param texto Texto pre definido que sera impresso mo arquivo HTML.
   @param tamanho Tamanho do campo que sera escrito no arquivo HTML.
   @param atual Posicao atual do ponteiro no arquivo HTML.
   
 */
int escreve(FILE *origem, FILE *destino, char texto[], int tamanho, int atual);

/**
  @brief Funcao que faz aparecer a imagem no arquivo HTML.
  
  @param origem Arquivo onde esta contida as informacoes(base de dados).
  @param destino Arquivo de destino(em HTML).                
  @param texto Texto pre definido que sera impresso mo arquivo HTML.
  @param tamanho Tamanho do campo que sera escrito no arquivo HTML.
  @param atual Posicao atual do ponteiro no arquivo HTML.
  
   */
void escreve_img(FILE *origem, FILE *destino, char texto[], int tamanho, int atual);

/**
   @ brief Escreve as tags que iniciam o codigo HTML.
   
   @param arq Arquivo HTML em que sera escrito as tags.
   
    */
void inicio_HTML(FILE *arq);

/** 
    @brief Arquivo que coordena a escrita do(s) resultado(s) da busca no arquivo HTML. Chama a funcao procura para isso.
    
    @param resultado arquivo HTML em que sera escrito as informacoes da obra.
    @param nrr NRR do registro que sera escrito no arquivo HTML.
    
     */
void meio_HTML (FILE *resultado, int nrr);

/**
   @brief Escreve as tags que finalizam o codigo HTML.
   
   @param arq Arquivo HTML em que sera escrito as tags.
   
    */
void fim_HTML (FILE *arq);

/** 
    @brief Cada funcao abaixo procura a obra com o campo especificado.

    @param titulo Campo a ser procurado.
    @param obras Vetor de indice primario.
    @param SK Vetor de indice secundario.
    @param tamanho Tamanho do vetor de indice secundario.
    @param arquivo Arquivo de indice secundario correspondente, contendo uma lista invertida com as obras.
    @param tam_nrr Tamanho do vetor de indice primario.
    */
void procura_tit(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr);
void procura_tipo(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr);
void procura_autor(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr);
void procura_ano(char *titulo, pNo_PK obras, pNo_PK SK, int tamanho, int tam_nrr);

/**
   @brief Procura (usando bsearch) um titulo na lista de obras e cria um arquivo HTML com o resultado.
   
          @param titulo Campo a ser procurado.
          @param obras Vetor de indice primario.
          @param SK Vetor de indice secundario.
          @param tamanho Tamanho do vetor de indice secundario.
          @param arquivo Arquivo de indice secundario correspondente, contendo uma lista invertida com as obras.
          @param tam_nrr Tamanho do vetor de indice primario.
   
    */
void procura_aux(char *titulo, pNo_PK obras, pNo_PK SK,  int tamanho, FILE *arquivo, int tam_nrr);

/**
   @brief Lista todas as obras em um arquivo HTML.
   
   @param obras Vetor de indice primario.
   @param tamanho Tamanho do vetor de indice primario.
   
    */
void lista_HTML(pNo_PK obras, int tamanho);

